// redux compose  koa / express vue-router

// 早期写法  c(b(a()))
// @c
// @b
// @a
// class xxx

// a() | b() | c()

function doubleValue(n) {
  // 单参数
  return n + n;
}
function toFixed(n) {
  // 单参数
  return n.toFixed(2);
}
function addPrefix(n) {
  // 单参数
  return "$" + n;
}

function flowRight(...fns) {
  if (fns.length == 0) {
    return;
  }
  return fns.reduceRight((a, b) => {
    return (...args) => b(a(...args));
  });
}
// a = doubleValue  b = toFixed     r = (...args) => toFixed(doubleValue(...args));

// a =  (...args) => toFixed(doubleValue(...args));     b = addPrefix    (...args) => b(a(...args));

// addPrefix(toFixed(doubleValue(100)));

let composeFn = flowRight(addPrefix, toFixed, doubleValue);
console.log(composeFn(100)); // 定义的过程不关心参数， PointFree 模式  （定义成与参数无关的函数，在使用参数）
